import javax.management.ListenerNotFoundException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 23735
 * Date: 2022-09-04
 * Time: 15:18
 */
class ListNode{
    private int data;
    public  ListNode next;
    //带参构造函数
    public ListNode(int data){
        this.data=data;
        this.next=null;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public ListNode getNext() {
        return next;
    }

    public void setNext(ListNode next) {
        this.next = next;
    }
}
public class MyLinkedList {
    //记录头节点
    private ListNode head;
    private ListNode tail;
    //记录节点个数
    private int nodeNum;
    //构造函数
    public MyLinkedList(){
        this.head=null;
        this.tail=null;
        this.nodeNum=0;
    }
    //打印链表
    public void disPlay(){
        if(this.nodeNum==0){
            System.out.println("链表为空");
            return;
        }
        ListNode cur=this.head;
        while(cur!=null){
            System.out.print(cur.getData()+" ");
            cur=cur.next;
        }
        System.out.println();
    }
    //得到链表节点数
    public int getSize(){
        return this.nodeNum;
    }
    //头插
    public void headInsert(int data){
        ListNode temp=new ListNode(data);
        if(this.head==null){
            this.tail=temp;
        }
        temp.next=this.head;
        this.head=temp;
        this.nodeNum++;
    }
    //尾插
    public void tailInsert(int data){
        ListNode temp=new ListNode(data);
        if(this.head==null){
            this.head=temp;
            this.tail=temp;
            this.nodeNum++;
            return ;
        }
        this.tail.next=temp;
        this.tail=temp;
        this.nodeNum++;
    }
    //查找下标前一个位置
    public ListNode findIndexPrev(int index){
        int pos=0;
        ListNode temp=head;
        while(pos<index-1){
            temp=temp.next;
            pos++;
        }
        return temp;
    }
    //任意位置插入
    public void insertIndex(int index,int data){
        if(index<0||index>this.nodeNum){
            System.out.println("插入位置不在合法范围");
            return;
        }
        if(index==0){
            headInsert(data);
            return ;
        }
        else if(index==this.nodeNum){
            tailInsert(data);
            return ;
        }
        ListNode prev=findIndexPrev(index);
        ListNode temp=new ListNode(data);
        temp.next=prev.next;
        prev.next=temp;
        this.nodeNum++;
    }
    //查找数据为data的节点的前一个
    public ListNode findDataPrev(int data){
        ListNode temp=this.head;
        while(temp.next!=null){
            if(temp.next.getData()==data){
                return temp;
            }
            temp=temp.next;
        }
        return null;
    }
    //删除数据为data的一个节点
    public void removeOne(int data){
        if(this.nodeNum==0){
            System.out.println("链表为空");
            return ;
        }
        if(this.head.getData()==data){//头节点就得删除
            this.head=this.head.next;
            if(this.head==null){
                this.tail=null;
            }
            this.nodeNum--;
            return;
        }
        ListNode prev=findDataPrev(data);
        if(prev==null){
            System.out.println("未找到该数据");
            return;
        }
        prev.next=prev.next.next;
        this.nodeNum--;
        if(prev.next==null){
            this.tail=prev;
        }
        return;
    }
    //删除所有值为data的节点
    public void removeAll(int data){
        ListNode prev=this.head;
        ListNode cur =this.head.next;
        while(cur!=null){
            if(cur.getData()==data){//需要删除
                prev.next=cur.next;
                cur=cur.next;
                this.nodeNum--;
            }
            else{//不需删除
                prev=prev.next;
                cur=cur.next;
            }
        }
        this.tail=prev;
        if(this.head.getData()==data){
            this.head=this.head.next;
            this.nodeNum--;
            if(this.head==null){
                this.tail=null;
            }
        }
    }
    //清空链表
    public void clear(){
        while (this.head!=null){
            ListNode headNext=head.next;
            head=null;
            head=headNext;
        }
        this.nodeNum=0;
        this.tail=null;
    }
}
